package util

import (
	"github.com/pkg/errors"
	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/core/columnd"
)

// CheckInfoExtralForUpdate 由用户更新信息时的扩展信息检查
func CheckInfoExtralForUpdate(ctrl []columnd.ColumnExtraItem, val map[string]interface{}) error {
	if val == nil {
		return nil
	}
	i := 0
	for _, ext := range ctrl {
		if _, ok := val[ext.Code]; ok {
			i++
			if ext.Isupdate == 0 {
				return errors.Errorf("禁止更新属性(%s)", ext.Code)
			}
		}
		switch ext.Kind {
		case "file":
			if err := checkFile(ext, val); err != nil {
				return err
			}
		case "text":
			// TODO: 还没有实现
		}

	}
	if i < len(val) {
		return errors.Errorf("有不支持的扩展属性")
	}
	return nil
}

// CheckInfoExtral 信息上传时进行扩展信息校验
// ctrl 需要校验的控制参数
// val 上传的值
func CheckInfoExtral(ctrl []columnd.ColumnExtraItem, val map[string]interface{}) error {
	for _, ext := range ctrl {
		if ext.Required == 1 {
			if val == nil || val[ext.Code] == nil {
				return errors.Errorf("扩展参数(%v:%v)不能为空", ext.Name, ext.Code)
			}
		}
		switch ext.Kind {
		case "file":
			if err := checkFile(ext, val); err != nil {
				return err
			}
		case "text":
			// TODO: 还没有实现
		}

	}
	return nil
}
func checkFile(ext columnd.ColumnExtraItem, val map[string]interface{}) error {
	if t, ok := ext.ParamValues["num"]; ok {
		n, ok := t.(float64)
		if !ok {
			return errors.Errorf("%v 数据格式错误", ext.Name)
		}
		num := int(n)
		if files, ok := val[ext.Code]; ok && files != nil {
			switch fs := files.(type) {
			case []string:
				if len(fs) > num {
					return errors.Errorf("%v 上传文件数量超过%d个。", ext.Name, num)
				}
			case []interface{}:
				if len(fs) > num {
					return errors.Errorf("%v 上传文件数量超过%d个。", ext.Name, num)
				}
			case string:
				delete(val, ext.Code)
				return nil
			default:
				return errors.Errorf("%v 数据格式错误", ext.Name)
			}
		}
	}
	return nil
}
